#!/bin/bash

#====================================================================
# 输入/输出重定向
# 参考：https://www.runoob.com/linux/linux-shell-io-redirections.html
#====================================================================

# 一般情况下，每个 Unix/Linux 命令运行时都会打开三个文件：
# 标准输入文件(stdin)：stdin的文件描述符为0，Unix程序默认从stdin读取数据。
# 标准输出文件(stdout)：stdout 的文件描述符为1，Unix程序默认向stdout输出数据。
# 标准错误文件(stderr)：stderr的文件描述符为2，Unix程序会向stderr流中写入错误信息。
# 默认情况下，command > file 将 stdout 重定向到 file，command < file 将stdin 重定向到 file。

# 常见的文件描述符
# 0 --- stdin  标准输入
# 1 --- stdout 标准输出
# 2 --- stderr 标准错误输出

#先把文件内容清空
echo "" > public/file/redirect.txt
echo "" > public/file/error.txt
echo "" > public/file/output.txt
echo "" > public/file/all.txt

echo "我是重定向内容" > public/file/redirect.txt #1-标准输出

# 注意: 2> 1> 数字与符号之间不能有空格，2> 是一体的时候才表示错误输出
ls 2> public/file/error.txt 1> public/file/output.txt #如果发生错误，则输出到error.txt，如果执行正常，则输出到output.txt
ls -yyy &> public/file/all.txt #-yyy是一个不存在的参数，不管是正常信息还是错误信息，都输出到all.txt
ls -yyy &>> public/file/all.txt # >> 信息追加到all.txt

cat < public/file/redirect.txt # < 从文件读取内容

ls -yyy 2> /dev/null #如果希望执行某个命令，但又不希望在屏幕上显示输出结果，那么可以将输出重定向到 /dev/null
cat -yyy 2 > /dev/null 2>&1 # 这里的意思是，如果cat -yyy 2 > /dev/null这一部分执行失败，那么会把错误输出到屏幕
# ??? 疑问：没搞懂，2>和2 >有时中间要带空格，有时必须去掉空格

# 下面这条然并卵，等价于ls -yyy
ls -yyy 2>&1 # 意思是如果发生错误，先重定向到标准输出(用&1来表示标准输出)，个人感觉有点多此一举，因为默认就是这样处理的

cat << EOF
我是Here document
EOF